/**
 * Vue项目构建服务
 * 负责自动构建导出的Vue项目并实现依赖缓存机制
 */

import { ElMessage, ElNotification } from 'element-plus';

class VueProjectBuilderService {
  constructor() {
    this.initialized = false;
    this.building = false;
    this.cachePath = ''; // 依赖缓存路径，通过IPC与主进程获取
    // 检查是否在Electron环境
    this.isElectronEnvironment = !!window.electronAPI?.invoke;
  }

  /**
   * 初始化构建服务
   */
  async initialize() {
    if (this.initialized) return;
    
    try {
      // 检查Electron环境
      if (!this.isElectronEnvironment) {
        console.warn('[VueProjectBuilderService] 不在Electron环境中，构建功能将不可用');
        this.initialized = true; // 标记为已初始化，但功能受限
        return;
      }
      
      // 获取缓存路径
      try {
        const cacheResult = await window.electronAPI.invoke('get-npm-cache-path');
        if (cacheResult.success) {
          this.cachePath = cacheResult.path;
          console.log('[VueProjectBuilderService] 缓存路径:', this.cachePath);
        } else {
          console.warn('[VueProjectBuilderService] 获取缓存路径失败:', cacheResult.message);
        }
      } catch (error) {
        console.warn('[VueProjectBuilderService] 获取缓存路径时出错:', error.message);
        // 继续初始化，但缓存功能可能不可用
      }
      
      this.initialized = true;
    } catch (error) {
      console.error('[VueProjectBuilderService] 初始化失败:', error);
      ElMessage.error('项目构建服务初始化失败，但您仍可以导出项目文件');
    }
  }

  /**
   * 构建Vue项目
   * @param {string} projectPath 项目路径
   * @param {Object} options 构建选项
   * @returns {Promise<Object>} 构建结果
   */
  async buildProject(projectPath, options = {}) {
    if (!this.initialized) {
      await this.initialize();
    }
    
    if (!this.isElectronEnvironment) {
      return { 
        success: false, 
        message: '当前环境不支持自动构建，您可以下载项目文件后手动构建' 
      };
    }
    
    if (this.building) {
      return { success: false, message: '已有构建任务正在进行' };
    }
    
    // 声明notification变量在try/catch块外部
    let notification;
    
    try {
      this.building = true;
      
      const {
        useChineseRegistry = true, // 是否使用国内源
        skipCache = false,         // 是否跳过缓存
        buildMode = 'development'  // 构建模式：development 或 production
      } = options;
      
      // 显示构建通知
      notification = ElNotification({
        title: '开始构建项目',
        message: '正在准备构建环境，这可能需要几分钟时间...',
        type: 'info',
        duration: 0,
        position: 'bottom-right',
        showClose: false,
        id: 'build-notification'
      });
      
      // 配置构建参数
      const buildParams = {
        projectPath,
        useChineseRegistry,
        skipCache,
        buildMode,
        cachePath: this.cachePath
      };
      
      // 通过IPC调用主进程执行构建
      const result = await window.electronAPI.invoke('build-vue-project', buildParams);
      
      // 关闭之前的通知
      if (notification) {
        notification.close();
      } else {
        ElNotification.closeAll(); // 备用方法，关闭所有通知
      }
      
      // 显示构建结果
      if (result.success) {
        ElNotification({
          title: '构建成功',
          message: `项目已成功构建到: ${result.outputPath}`,
          type: 'success',
          duration: 8000,
          position: 'bottom-right'
        });
      } else {
        ElNotification({
          title: '构建失败',
          message: result.message || '未知错误',
          type: 'error',
          duration: 10000,
          position: 'bottom-right'
        });
      }
      
      // 添加额外的npm安装命令
      const additionalDeps = result.success ? 
        '' : 
        `echo "安装额外依赖..." && npm install terser@latest --save-dev && `;
      
      // 构建命令
      const buildCommand = `cd "${projectPath}" && ${additionalDeps}npm run build`;
      
      return result;
    } catch (error) {
      console.error('[VueProjectBuilderService] 构建失败:', error);
      if (notification) {
        notification.close();
      } else {
        ElNotification.closeAll(); // 备用方法，关闭所有通知
      }
      ElNotification({
        title: '构建错误',
        message: `构建过程中发生错误: ${error.message || '未知错误'}`,
        type: 'error',
        duration: 10000,
        position: 'bottom-right'
      });
      return { success: false, message: error.message || '未知错误' };
    } finally {
      this.building = false;
    }
  }
  
  /**
   * 检查环境是否可以构建项目
   * @returns {Promise<boolean>} 是否可构建
   */
  async canBuildProject() {
    if (!this.isElectronEnvironment) {
      return false;
    }
    
    if (!this.initialized) {
      await this.initialize();
    }
    
    try {
      const result = await window.electronAPI.invoke('check-build-environment');
      return result.success;
    } catch (error) {
      console.error('[VueProjectBuilderService] 检查构建环境失败:', error);
      return false;
    }
  }
}

// 创建单例实例
const vueProjectBuilderService = new VueProjectBuilderService();

export default vueProjectBuilderService; 